前幾天我們把豬這個實體轉變成不會動的裝飾品,花了很多時間解釋做法與變更大小。這樣的行為其實有點違背Minecraft的精神 (我們應該自定義一個長得像"豬"的物品來實作)。
而且太過複雜的程式碼似乎會讓想要自行開發模組的人望而卻步?
因此,今天開始我們要來做一些簡單但是不一樣的事件 - 實體的跳躍。
如果你有玩過一陣子,應該知道在創造模式下的世界是可以飛行的。我們現在自行開發的模組,未來是希望可以分享給其他人一起玩 (如果你是喜愛單機遊戲的請自動忽略這段),因此,在一般的情況下,通常不會開一個創造模式來與其他玩家一起玩。
畢竟,上帝只有一個,不是嗎?
預設一個玩家可以跳1.252個方塊,要跳過一個方塊通常是沒問題,但我們會有情況需要讓玩家可以跳得更高 (比如你意外的往腳底下挖了100公尺深),所以我們需要讓玩家擁有跳的更高的能力。
我們先在com.ithome.mymod套件下新增一個SuperJump
類別,並且加入LivingJumpEvent
處理跳躍的事件。
public class SuperJump {
@SubscribeEvent
public void jumpHigher(LivingJumpEvent event) {
}
}
在新的jumpHigher
方法內,判斷實體是否為玩家;若為是,將跳躍(Y軸方向)的高度乘上5 (實際大約可以跳23個方塊高)。
@SubscribeEvent
public void jumpHigher(LivingJumpEvent event) {
if(event.entity instanceof EntityPlayer) {
event.entity.motionY *= 5;
}
}
在主程式內註冊我們新的類別。
MinecraftForge.EVENT_BUS.register(new SuperJump());
存檔後進入遊戲,這次我們不要使用創造模式,嘗試跳躍看看:
嗯...是可以跳得很高沒錯,但好像落地的時候會受傷,這是因為在Minecraft裡如果從超過3個方塊的地方掉落,我們就會受傷!所以,我們需要處理掉落時的事件LivingFallEvent
。
在SuperJump
類別內,加入新的avoidFallDamage
方法,並且判斷當玩家為潛行時,就不會造成受傷。
@SubscribeEvent
public void avoidFallDamage(LivingFallEvent event) {
// 是玩家才進行處理
if(event.entity instanceof EntityPlayer) {
EntityPlayer player = (EntityPlayer) event.entity;
// 當玩家為潛行狀態時,將此事件取消 (即沒有"掉落"這個狀態,就不會受傷)
if(player.isSneaking()) {
event.setCanceled(true);
}
}
}
再次存檔進入遊戲,你應該可以在掉下時按下Shift
鍵來避免落地時受傷。到目前為止,我們可以將這個模組做的更好一點:
首先是潛行降落的速度調整。這個可以透過我們調整第一步驟的motionY
變數來達到目的。問題是,我們要將這個邏輯放在哪個事件呢?
LivingFallEvent
: 看起來很直覺,但這個事件已經是"掉落開始後"處理的,掉落速度在這裡設定不會有效果。LivingJumpEvent
: 嗯...PlayerTickEvent
: 這個是在遊戲的每一刻處理玩家的事件,我們可以在這邊改變潛行時的速度。回到SuperJump
類別,加入新的equipParachute
方法。
@SubscribeEvent
public void equipParachute(PlayerTickEvent event) {
EntityPlayer player = event.player;
if(player.isSneaking()) {
player.motionY = -0.05;
}
}
然後你就可以進去遊戲裡面試看看潛行時是否會放慢速度了...什麼?你說沒有效?
這裡其實我們還需要在主程式內的另一個事件巴士上註冊這個SupoerJump
事件類別去處理PlayerTickEvent
這個事件 (因為這個事件是在net.minecraftforge.fml.common.gameevent
套件下):
FMLCommonHandler.instance().bus().register(new SuperJump());
若有興趣想知道原理的人可以看看這篇,這裡由於篇幅會太長太複雜的關係,就不詳細闡述。
好了,再次回到Minecraft,玩看看我們新的模組,享受頭頂沒有東西(?)卻可以緩慢降落的感覺吧!
關於如何在頭頂上掛上降落傘可以參考這個模組,我們明天將講述如何使用指令。